/*
 * consola.c
 *
 *  Created on: 10/12/2009
 *      Author: teledhil
 */

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "comandos.h"
#include "consola.h"

int consola_leer_linea(char *linea, FILE *stream) {
	/*Devuelve: numero de caracteres leidos*/

	char *fin_linea;

	/*Obtiene una linea de stream*/
	if (fgets(linea, MAX_LONG_LINEA, stream)) {
		/*Busca caracteres fin de linea y los sustituye por espacios*/
		fin_linea = strchr(linea, '\n');
		while (fin_linea) {
			*fin_linea = ' ';
			fin_linea = strchr(linea, '\n');
		}
	}

	/*fprintf(stderr,"@Debug leer_linea Linea: |%s|%d\n",linea,
	 (int)strlen(linea));*/
	return (int) strlen(linea);
}

int consola_sacar_argumentos(char *linea, char **argv[]) {
	/*Devuelve: numero de argumentos leidos*/

	int num_argumentos = 0;
	/*char argumento[MAX_LONG_LINEA]="";
	 int offset=0;*/
	char *argumento;
	static char espacios[] = " \f\n\r\t\v";
	char *destino;
	char *ptOrigen, *ptDestino;
	char c, d;
	int i = 0;
	char **argumentos;

	/*fprintf(stderr,"@Debug sacar_argumentos Linea: |%s|%d\n",linea,
	 (int)strlen(linea));*/
	/*while ((sscanf(linea+offset, "%s", argumento))>0) {
	 fprintf(stderr,"@Debug sacar_argumentos Argumento: |%s|%d\n",
	 argumento,(int)strlen(argumento));

	 offset+=(int)strlen(argumento)+1;

	 //Vacia leido
	 memset(argumento,'\0',strlen(argumento));
	 num_argumentos++;
	 }*/

	destino = malloc((strlen(linea) + 1) * sizeof(char));
	if (destino == NULL) {
		fprintf(stderr, "Error en malloc destino\n");
		return -1;
	}

	//Copia los argumentos en un nuevo vector
	for (num_argumentos = 1, ptOrigen = linea, ptDestino = destino; (c
			= *ptOrigen); ptOrigen++, ptDestino++) {

		if (strchr(espacios, c)) {
			if (d != '\0') {
				num_argumentos++;
			}
			c = '\0';
		}
		d = c;
		*ptDestino = c;
	}
	*ptDestino = '\0';

	argumentos = malloc((num_argumentos + 1) * sizeof(char *));
	if (argumentos == NULL) {
		fprintf(stderr, "Error en malloc argumentos\n");
		return -1;
	}

	for (i = 0, ptOrigen = destino; ptOrigen < ptDestino; ptOrigen += (strlen(
			ptOrigen) + 1)) {

		if (*ptOrigen == '\0') {
			continue;
		}
		argumento = malloc((strlen(ptOrigen) + 1) * sizeof(char));
		strcpy(argumento, ptOrigen);
		argumentos[i] = argumento;
		i++;
		/*fprintf(stderr,"@Debug sacar_argumentos Argumento: |%s|%d\n",
		 argumento,(int)strlen(argumento));*/
	}
	argumentos[i] = NULL;

	/*i=0;
	 while(argumentos[i]!=NULL) {
	 fprintf(stderr,"@Debug sacar_argumentos Argumento (%d): |%s|\n",i+1,
	 argumentos[i]);
	 i++;
	 }*/

	/*Libera el vector destino*/
	free(destino);

	*argv = argumentos;

	return num_argumentos - 1;

}

int consola_eval(char *argumentos[], int eval) {
	/*Devuelve: 0 si exito*/
	int i = 0;

	//fprintf(stderr, "@Debug eval Argumentos: %d\n", eval);
	while (argumentos[i] != NULL) {
		//	fprintf(stderr, "@Debug eval Argumento (%d): |%s|\n", i + 1, argumentos[i]);
		i++;
	}

	if (argumentos[0] != NULL) {
		//FIND [keyword]
		if ((strcmp("find", argumentos[0]) == 0)) {
			//	fprintf(stderr, "FIND!\n");
			if (argumentos[1] != NULL) {
				r_find(argumentos[1]);
			}

			//GET [ID]
		} else if ((strcmp("get", argumentos[0]) == 0)) {
			//	fprintf(stderr, "GET!\n");
			i = 1;
			while (argumentos[i] != NULL) {
				r_get(atoi(argumentos[i]));
				i++;
			}

			//INFO [value]
		} else if ((strcmp("info", argumentos[0]) == 0)) {
			//	fprintf(stderr, "INFO!\n");
			if (argumentos[1] != NULL) {
				i = 1;
				while (argumentos[i] != NULL) {
					//uploads
					if ((strcmp("uploads", argumentos[i]) == 0)) {
						r_info(INFO_UPLOADS);
						//downloads
					} else if ((strcmp("downloads", argumentos[i]) == 0)) {
						r_info(INFO_DOWNLOADS);
						//hosts
					} else if ((strcmp("hosts", argumentos[i]) == 0)) {
						r_info(INFO_HOSTS);
					} else {
						fprintf(stdout, "Opción desconocida\n");
					}
					i++;
				}
			} else {
				//r_info(INFO_ALL);
				r_info(INFO_UPLOADS);
				r_info(INFO_DOWNLOADS);
				r_info(INFO_HOSTS);
			}

			//STOP [ID]
		} else if ((strcmp("stop", argumentos[0]) == 0)) {
			//	fprintf(stderr, "STOP!\n");
			i = 1;
			while (argumentos[i] != NULL) {
				r_stop(atoi(argumentos[i]));
				i++;
			}

			//EXIT
		} else if ((strcmp("exit", argumentos[0]) == 0) || (strcmp("quit",
				argumentos[0]) == 0)) {
			//	fprintf(stderr, "EXIT!\n");
			r_exit();
			return -1;

			//SET [variable] [value]
		} else if ((strcmp("set", argumentos[0]) == 0)) {
			//	fprintf(stderr, "SET!\n");
			if (argumentos[1] != NULL) {
				//rowebcache [url]
				if ((strcmp("rowebcache", argumentos[1]) == 0)) {
					if (argumentos[2] != NULL) {
						r_set_rowebcache(argumentos[2]);
					} else {
						r_show_rowebcache();
					}
					//localport [port]
				} else if ((strcmp("localport", argumentos[1]) == 0)) {
					if (argumentos[2] != NULL) {
						r_set_localport(atoi(argumentos[2]));
					} else {
						r_show_localport();
					}
					//sharepath [path]
				} else if ((strcmp("sharepath", argumentos[1]) == 0)) {
					if (argumentos[2] != NULL) {
						r_set_sharepath(argumentos[2]);
					} else {
						r_show_sharepath();
					}
					//incomingpath [path]
				} else if ((strcmp("incomingpath", argumentos[1]) == 0)) {
					if (argumentos[2] != NULL) {
						r_set_incomingpath(argumentos[2]);
					} else {
						r_show_incomingpath();
					}
					//downloadpath [path]
				} else if ((strcmp("downloadpath", argumentos[1]) == 0)) {
					if (argumentos[2] != NULL) {
						r_set_downloadpath(argumentos[2]);
					} else {
						r_show_downloadpath();
					}

				} else {
					fprintf(stdout, "Variable desconocida\n");
				}
			} else {
				//r_set();
				r_show_rowebcache();
				r_show_localport();
				r_show_sharepath();
				r_show_incomingpath();
				r_show_downloadpath();
			}

		} else {
			fprintf(stdout, "Comando desconocido\n");
		}
	}
	return 0;
}

int bucle_consola() {

	char leido[MAX_LONG_LINEA] = "";

	int num_arg = 0;
	char **argumentos;

	fprintf(stdout, "> ");
	fflush(stdout);
	while (consola_leer_linea(leido, stdin) > 0) {
		num_arg = consola_sacar_argumentos(leido, &argumentos);

		if (consola_eval(argumentos, num_arg) < 0) {
			return 0;
		}
		/*Vacia leido*/
		memset(leido, '\0', strlen(leido));
		fprintf(stdout, "> ");
		fflush(stdout);
	}
	fprintf(stderr, "Fin lectura comandos. Rotella se cierra\n");
	r_exit();

	return 0;

}
